package ChainArriere;

import java.util.Vector;
/* La classe definissant les Faits */

class Fait {

	/* Partie statique */
	static Vector liste;
	
	/* Partie dynamique */

	public String libelle;				// Le 'nom' de la variable
	public boolean determination;		// Pour savoir si la valeur a ete fixee
	public boolean valeur;				// Si la variable est vraie ou fausse
	private Regle source;				// Donne la source si a ete infere
    private short position;
    public boolean viste; 			// deja visite  
	
	
	// Gestion de la liste des faits
	static public Vector getListe() {
		if (liste == null) liste = new Vector();
		return liste;
	}

	// Creation securitaire d'un nouveau fait (sans doublon!)
	static public Fait creer(String lib) {
		String libelle = lib.trim();
		
		
		// Verifier la valeur positif
		for (int i = 0, max = liste.size(); i < max; i++)
			if (((Fait) liste.get(i)).nom().equals(libelle))
				return ((Fait) liste.get(i));	// Existe deja!
		
			
		boolean val = true;		
		
		// V1: S'il n'exist pas, on verifie la valeur negative  
		if( libelle.length() > 4 && libelle.substring(0,3).equals("NOT"))
				val = false;	
						

		Fait nouveau = new Fait(libelle);			
		nouveau.valeur = val;
		nouveau.viste = false;
		
		
		liste.add(nouveau);			
		return nouveau;
	}

	// Le constructeur [ prive!!! -- utiliser Fait.creer("libelle") ]
	private Fait(String libelle)
	{
		this.libelle = libelle;
		determination = false;		// Pas ete determine
		source = null;	// Pas ete infere...
        position = 1;
	}

	// Methodes d'acces
	public String nom() {
		return libelle;
	}

	public Regle getSource() {
		return source;
	}

	public boolean ok() {
		return determination;
	}

	public void set(boolean valeur, Regle source) {
		determination = true;
		this.valeur = valeur;
		this.source = source;
		
		
		//V1: On va mettre a jour les valeurs inverse 
		for (int i = 0; i < liste.size(); i++)
		{
			Fait temp = (Fait)liste.get(i);			
			String s = this.libelle;
			
			// Si NOT(s) , on mise a jour la valeur s
			if( s.length() > 4 && s.substring(0,3).equals("NOT"))
			{
				String x = s.substring(4,s.length()-1);
				if (temp.nom().equals(x))
				{
					temp.valeur = !this.valeur;
					temp.determination = true;
				}
			}
			else // Si s, on mise a jour NOT(s)
			{
				if (temp.nom().equals("NOT("+s+")"))
				{
					temp.valeur = !this.valeur;
					temp.determination = true;
				}
			}				
		}		
		// Fin -V1
		
		
	}

	public boolean get() {
		if (!determination)
			System.out.println("acces illegal!");
		return valeur;
	}

	// toString
	public String toString() {
		return libelle;
	}

}

